"""
Регистрация при необходимости.
Загружает куки. Собирает ссылки на вакансии
Удаляет старые вакансии
Собирает описание вакансий
Удаляет организации без телефонов.
Удаляет дубли по телефонам и запрещенные организации.
Сливает вакансии в общую таблицу.
Ссылки на вакансии из рабочей таблицы добавляются в архив ссылок
Запоминает куки и выходит.
"""

import sys
import os
import logging                                                                  # запись логов
import re                                                                       # регулярные выражения
import sqlite3


from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

from modules.lib import MainForm, del_old_ref, add_ref, clean_org, cookies_load

all_cycle = [
    'cookies_load(self)',
    'collect_ref(self)',
    'del_old_ref(self)',
    'add_ref(self)',
    'load_vacant(self)',
    'clean_org(self)',
    'find_CRM(self)',
    'out(self)',
    'cookies_save(self)',
    'quit()']

def main():

    """
    """

    app = QApplication(sys.argv)
    
    logging.basicConfig(filename='log.txt',level=logging.DEBUG,
        format = u'%(filename)s[LINE:%(lineno)d]# %(levelname)-8s %(message)s')

    form = MainForm('ru63','63ru')

    sys.exit(app.exec_())

    
def collect_ref(form):

    """ СОБИРАЕМ ССЫЛКИ.(Принимаем указатель на форму).
    -- Обнуляем таблицу "сырых" ссылок.
    -- Создаем шаблоны страниц ссылок и ссылок.
    -- Загружаем последовательно страницы ссылок.
    --
    -- Выход из цикла "не найден шаблон страницы".

    Собирает ссылки на вакансии с сайта и вставляет в таблицу vacant.
    """
    
    query = form.conn.cursor()                                                      # для обхода записей
    query.executescript("DELETE FROM vacant; VACUUM;")                          # очистить рабочую таблицу и схлопуть базу

    pattern_page = re.compile('pageslink_active')                    # re текущая страница
    pattern_ref = re.compile('http://63.ru/job/vacancy/[\d]+?.html')             # re ссылка на вакансию

    n = 1                                                                       # начинаем с первой страницы
    while 1:                                                                    # бесконечный цикл
        url = ('http://63.ru/job/vacancy/{}.php?firstPage=0'
            .format(n))                                                  
        form.line.setText(url)                                          # показать загружаемый URL
        form.web.get(url)
        html = form.web.html
        
        m = pattern_page.search(html)                                       # ищем номер загруженной страницы
        if m:                                                                   # найден
            list_url = pattern_ref.findall(html)                        # совпало. находим все URL ссылки на вакансии
            values = []                                                     # преобразуем список
            for url in list_url:                                            # найденных вакансий
                values.append('("' + url + '")')    #
            sql = ('INSERT INTO vacant (url) VALUES {};'.                   # в INSERT запрос
                   format(','.join(values)))                                #
            try:                                                            # обработка исключения
                query.execute(sql)                                          # вставляем ссылки в таблицу vacant
            except sqlite3.Error as e:
                logging.error('btn_collect_ref_click: {} {}'.
                    format( e.args[0],sql))
                QMessageBox.critical(None, "КРИТИЧЕСКАЯ ОШИБКА", "Подробности в log.txt.")
                quit()        
        else:
            break                                                           # не совпал, выходим из бесконечного цикла
        n += 1

    query.close()


def load_vacant(form):
    """ СОБИРАЕМ ОПИСАНИЕ ВАКАНСИЙ (принимаем указатель на форму).
    -- 
    """
    
    def no_space(line):
        return ''.join(c for c in line if ord(c) >= 32)
    
    pattern_face = re.compile('Контактное лицо</td> <td>(.+?)(</td>)')                    # контактоное лицо
    pattern_org = re.compile(' - вакансия (.+?)( - Работа в Самаре)')                       # название компании
    pattern_phone = re.compile('Телефон</td> <td>(.+?)(</td>)')                  # контактный телефон

    select = form.conn.cursor()                                                      # для обхода записей
    update = form.conn.cursor()                                                      # для обновления записей

    select.execute("SELECT count(*) FROM vacant;")                              # количество записей
    rec = select.fetchone()                                                     # в таблице vacant
    form.pb.setRange(0,rec[0])                                                       # инициализация индикатора процесса

    select.execute("SELECT ROWID, url FROM vacant;")                            # запрос по всем записям таблицы
    ind = 0                                                                     # текущее значение прогресс бара

    for id, ref in select:                                                      # текущая запись и ссылка
        form.line.setText('{}'.format(ref))                                          #
        form.web.get(ref)                                                            # загружаем страницу вакансии
        html = form.web.html
    
        ind += 1
        form.pb.setValue(ind)                                                        # индикатор процесса

        face, org, phone = '','',''                                             # очищаем переменные
        
        m = pattern_face.search(html)                                       # ищем контактное лицо
        if m:
            face = m.group(1)                                                     # если найдено - 1-я группа
        m = pattern_org.search(html)                                        # ищем название организации
        if m:
            org = m.group(1)                                                     # если найдено - 1-я группа
        m = pattern_phone.search(html)                                      # ищем контактный телефон
        if m:
            phone = m.group(1).replace("&nbsp;","")                                        # удаляем HTML разметку
            phone = no_space(phone)                                                  # если найдено - 1-я группа

        sql = ("UPDATE vacant SET face = '{}',org = ?,"                         #
            "phone = '{}' WHERE ROWID = {}".
            format(face, phone, id))
        try:
            update.execute(sql, (org,))                                         # обновляем запись
        except sqlite3.Error as e:
            logging.error('btn_load_vacant_click: {} {}'.format( e.args[0],sql))
            QMessageBox.critical(None, "КРИТИЧЕСКАЯ ОШИБКА", "Подробности в файле log.txt.")
            quit()        

    select.close()
    update.close()

    
def login(form):                                                          #

    """
    Cтраница регистрации пользователя.
    Пользователь должен залогонится. После этого необходимо сохранить куки.
    """
    
    cookies_load(form)                                                              # грузим куки
    url = 'http://63.ru/job'
    form.line.setText(url)                                          # показать загружаемый URL
    form.web.get(url)



if __name__ == '__main__':                                                      # ОСНОВНОЙ ЦИКЛ
    main()
